imwayland: Toggle OSK more sparingly
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 8 Feb 2019 22:11:48 +0000 (23:11 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Sat, 9 Feb 2019 00:08:35 +0000 (01:08 +0100)
Specifically it is avoided to be toggled if:
- Just received focus (in order to preserve OSK state across focus changes)
- Moving cursor around. Still allow some jitter as perfect accuracy is not
  possible.

Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1277
gtk/gtkimcontextwayland.c

index 7ec3efdb623c78a4d3f64015ff3f44bce9ebfbd1..adf1722035df6413e3a6ae4153f0fdf256caa3e2 100644 (file)
@@ -771,6 +771,8 @@ gtk_im_context_wayland_focus_in (GtkIMContext *context)
   if (!global->text_input)
     return;
 
+  if (self->gesture)
+    gtk_event_controller_reset (GTK_EVENT_CONTROLLER (self->gesture));
   global->current = context;
 
   if (global->focused)
@@ -806,9 +808,30 @@ gtk_im_context_wayland_set_cursor_location (GtkIMContext *context,
                                             GdkRectangle *rect)
 {
   GtkIMContextWayland *context_wayland;
+  int side;
 
   context_wayland = GTK_IM_CONTEXT_WAYLAND (context);
 
+  if (context_wayland->cursor_rect.x == rect->x &&
+      context_wayland->cursor_rect.y == rect->y &&
+      context_wayland->cursor_rect.width == rect->width &&
+      context_wayland->cursor_rect.height == rect->height)
+    return;
+
+  /* Reset the gesture if the cursor changes too far (eg. clicking
+   * between disjoint positions in the text).
+   *
+   * Still Allow some jittering (a square almost double the cursor rect height
+   * on either side) as clicking on the exact same position between characters
+   * is hard.
+   */
+  side = context_wayland->cursor_rect.height;
+
+  if (context_wayland->gesture &&
+      (ABS (rect->x - context_wayland->cursor_rect.x) >= side ||
+       ABS (rect->y - context_wayland->cursor_rect.y) >= side))
+    gtk_event_controller_reset (GTK_EVENT_CONTROLLER (context_wayland->gesture));
+
   context_wayland->cursor_rect = *rect;
   notify_cursor_location (context_wayland);
   commit_state (context_wayland);